Event management for large scale event-driven digital hardware spiking neural networks rn Q ' Louis-Charles Caron Michiel D'Haene Frederic Mailhot CN . Benjamin Schrauwen Jean Rouat 9^: April 3, 2013 < (N Abstract The interest in brain-like computation has led to the design of a . plethora of innovative neuromorphic systems. Individually, spiking neural , /^ l ' networks (SNNs), event-driven simulation and digital hardware neuromor- jyj , phic systems get a lot of attention. Despite the popularity of event-driven ^ ' SNNs in software, very few digital hardware architectures are found. This is because existing hardware solutions for event management scale badly with the number of events. This paper introduces the structured heap queue, a pipelined digital hardware data structure, and demonstrates /— s , its suitability for event management. The structured heap queue scales ^^ ' gracefully with the number of events, allowing the efficient implementa- \^^ ' tion of large scale digital hardware event-driven SNNs. The scaling is ("^ , linear for memory, logarithmic for logic resources and constant for pro- cessing time. The use of the structured heap queue is demonstrated on (^— N I field-programmable gate array (FPGA) with an image segmentation ex- f»f-\ ■ periment and a SNN of 65 536 neurons and 513 184 synapses. Events can be processed at the rate of 1 every 7 clock cycles and a 406x158 pixel image is segmented in 200 ms. > X 1 Introduction Neuromorphic systems attempt to mimic the way the brain processes informa- tion and are the test benches of new theories of the neural paradigm, exploration tools for connectionists and very intriguing computation platforms. Neuromor- phic systems can take many forms. They have been implemented on graphical processing units (GPU) [25[, digital signal processors (DSP) [28|, analog very- large-scale integration (aVLSI) circuits H, d igital VLSI (dVLSI) circuits |33j . field-programmable gate arrays (FPGA) |3a l34l. l5i. mixed-signal VLSI circuits [3, l21| and as software-hardware coprocessors [30] ■ Ultimately, the choice of the implementation platform depends on the application and the designer's specific needs. This paper focuses on digital hardware (dVLSI circuits and FPGAs) and aims at laying the ground for the design of large-scale embedded event-driven spiking neural networks. Spiking neurons, the third generation of artificial neurons, are more compu- tationally powerful than the previous generations [17| . A spiking neural network (SNN) is a collection of dynamical systems, the neurons, that affect each other through point-to-point links called synaptic connections. Spiking neurons are characterized by one or several state variables. The state of a spiking neuron changes over time and when it meets a certain condition, it emits a spike. Spikes are delivered to other neurons through the synaptic connections and are scaled by a factor, the synaptic weight. The neuron model specifies the equations that govern the evolution of the neuron's state variables in time, the condition for emitting a spike and the effect of receiving and emitting a spike. The network topology defines the interconnection pattern of the neurons and the value of the synaptic weights. Algorithm 1 Time-driven implementation repeat move one step forward in time for each neuron in the network do update state end for until desired time is reached Algorithm 2 Event-driven implementation repeat move one event forward in time for each neuron involved in the event do update state end for find next event to happen until desired time is reached A SNN implementation is the specific way in which time, the neuron model and spikes, or events, are handled in order to calculate the network's state at a desired point in time. Two different implementations are widely used and opposed: time-driven and event-driven. Both strategies are described in algo- rithm [Hand algorithm [21 A fundamental difference between both strategies lies in the time increment, at line [21 In a time-driven SNN, time is increased by a constant amount. The update of the neurons' state at line [4l is straightfor- ward, but the events occurring during a given time step are processed as if they occurred at the same point in time, which might not be exact. The choice of the time step is a compromise between processing speed and temporal accuracy. In some cases, it is possible to use temporal interpolation and restore a more accurate time of occurrence of the events [23|] . In the event-driven implementa- tion, the time steps fit the occurrence of events and optimal precision in time can be achieved. The state update of line [4l is more mathematically involved as the step size is variable. Also, progression in time can be slow if the average number of events occurring in the network per unit of time is high. A second difference is the number of neurons processed at each iteration of the for loop of line [31 In the time-driven algorithm, each neuron in the network is updated to the current time step. The event-driven strategy avoids this costly update of the whole population of neurons. It exploits the fact that if a neuron does not receive or emit a spike, then its state is defined by the dynamical equations of the neuron model. In an event-driven SNN, the state of a neuron is represented by the time at which it should spike next, as determined by the neuron model and without consideration for possible interactions with other neurons. This value, the predicted firing time, doesnt change as time passes, but only when a neuron is involved in an event. During an iteration of the processing loop, only the neurons affected by the current event are processed. Simple neuron models can be inverted in order to calculate the predicted firing times [22| . With more complex neuron models, it might be necessary to use iterative procedures [11 1 or to approximate the time of occurrence of events. Lastly, the event-driven algorithm involves one extra operation: identifying the next event to happen (line [6]). At every iteration of the main loop, an event is processed: it is removed from the list of predicted events and the state of the involved neurons is mod- ified. As a result, some predicted events get delayed, anticipated or cancelled, and new events are created. The event queue is the functional block whose role is to keep the list of events up to date and identify which one is the next to happen. It is a hybrid memory and sorting algorithm. In an event-driven SNN, the event queue has to carry the following operations: output the next event to happen, allow the insertion of new events, allow the deletion of existing events and allow the modification of existing events. The last operation, called an up- date, is optional since it can be replaced by the deletion of the event to modify followed by the insertion of the same event with the updated information. The main focus of this paper is to describe an efficient way to implement the event queue in a digital hardware event-driven SNN. The literature on software SNNs abounds in event-driven systems 23. [361.1 14. ISl [id . [9|, [2J] . In addition to implementing different neuron models and network topologies, each software SNN has its own way of managing the event queue. Pratt [29| and Watts [36| use a sorted list to implement it. Grassmann & Anlauf 14| do not specify how the event queue is managed. Mattia & Del Giudice [18| use an array of FIFOs, Lee & Farhat 116| use two heap queues, Delorme & Thorpe [9| use a pseudo-sorting algorithm by regular sampling and Mouraud & Puzenat [24[ use a variation of the calendar queue. On the hardware side. most architectures rely on a fixed time step approach to compute the neural dynamics and do not predict future events @, 0, M, IIM M ■ Mehrtash et al. [l3| and Schoenauer et al. [31[ use a variable step size for neuron state update, but only predict spikes occurring during the next time step. To our knowledge, only Agis et al. [l| follow a pattern similar to algorithm [5] and truly benefits from the advantages of the event-driven strategy in a digital hardware SNN. The fact that existing software event-driven SNNs use such a wide variety of algorithms to implement the event queue suggests that it plays a very important role and must be carefully designed. We postulate that the reason why so few hardware event-driven SNNs exist is because no digital hardware algorithm can efficiently fill the role of the event queue. The solution chosen by Agis et al. [l| , is to use an unsorted list, i.e. to store each event in memory to a designated place. By accessing the right address in this memory, any event can be read, inserted, deleted and modified. The identification of the next event to happen is done on demand by scanning the whole event queue and using a pipelined comparator tree to find the one with smallest time of occurrence. This strategy results in a 0{N) complexity in memory and 0{N) complexity in logic, where N is the capacity of the queue (maximum number of events). Read, insert, delete and update operations have a 0(1) complexity in time, and the search for the next event to happen has 0(log(A^)) complexity in time. That is, as the capacity of the event queue is increased, it takes more and more clock cycles to find the smallest time of occurrence in the list of events. This performance degradation as the network size increases can be avoided. In this paper, we introduce the Structured Heap Queue (SHQ) data structure as a candidate to implement the event queue in a large scale digital hardware event-driven SNN. The SHQ has a 0{N) complexity in memory, 0(log(A'')) complexity in logic and 0(1) complexity in time. The 0(1) complexity in time holds for all important operations on the queue and means that the number of clock cycles required for managing the event queue is independent of its size. We demonstrate the use of the SHQ in a FPGA SNN implementation and an image segmentation task. We show the result of a pixel-based image segmentation realized with the described system to illustrate the full design process of a digital event-driven SNN using the SHQ, from the neuron model to the application. The SHQ is an event management algorithm and can be coupled to any digital event-driven SNN. It is not restricted to the SNN implementation described in this paper. In section[2l the SHQ data structure is introduced. The design of the queue, the operations it supports, and the way to pipeline them in a digital hardware implementation are described. A memory-optimized version of the SHQ is also detailed in section [Ol The SNN we use to demonstrate the SHQ is presented in section [31 The hardware implementation of the SNN is described in section 13.31 The performance and resource usage of the system are presented in section m Section O discusses the performance of the SHQ and its use as an event queue and section [6] concludes the paper. 2 The Structured Heap Queue The structured heap queue (SHQ) is an implicit data structure derived from the binary heap queue [13J. Because we focus on hardware SNNs, we describe and evaluate the SHQ in this section by comparing it to the pipelined heap queue (PHQ) [l5|, a hardware implementation of the heap queue (see also [J|). In a PHQ, a set of elements is partially sorted in order to find the one with lowest (or highest) value. To facilitate the link with the event queue of an event-driven SNN, assume an element consists of two fields: a unique identification number (ID) and a value. In the explanations of section 13.3. 3[ an element's ID is a neuron number and its value is the neuron's predicted firing time. A PHQ takes the form of a binary memory tree with one 2-input comparator per level of the tree and some extra logic and registers for control. The PHQ supports two operations: insert a new element and delete the element in the root node. These operations are designed such that their execution maintains the heap property, that is, the guarantee that any node in the tree contains an element of smaller value than that of its 2 children nodes. The operations also keep the binary tree balanced, meaning that the elements spread in the tree over as few levels as possible. These two properties ensure that reading the root node will yield the element with lowest value, and that the tree is as compact as possible. The PHQ has 0{N) complexity in memory and 0(log(iV)) complexity in logic, with N the number of elements. It supports three operations, insert, delete element with lowest value and read element with lowest value, which all have 0(1) complexity in time. To use the PHQ as an event queue, it must be possible to delete an element with a given ID from the tree, even if it is not the element with lowest value. In the PHQ, one option is to scan the entire memory tree to find the element with corresponding ID in order to delete it, an operation with 0{N) complexity in time. The capability of finding arbitrary elements in the tree is required in all important operations of an event queue. The linear complexity in time of this operation in a PHQ would lead to catastrophic performance in a large scale SNN. However, the compactness of the tree, i.e. minimal memory usage, is not of the utmost importance for an event queue. The balanced property of the PHQ can be dropped to gain a degree of freedom in the placement of the elements in the tree. In a SHQ, this extra degree of freedom is used such that the search for an arbitrary element becomes a 0(1) complexity in time operation. The SHQ is an unbalanced PHQ in which any given element is constrained to be placed in a specific part of the tree, determined by the element's ID. The region of the tree assigned to an element is called a path, as it starts at the root node and ends at one of the leaf nodes. An element's path is found by scanning its ID from left to right, and progressing down the tree by branching either left or right depending on the value of the individual bits. This defines a unique path for each element and, when searching for an element with a given ID, one single node per level has to be checked. Figure [T] shows a schematic representation of the binary memory tree and highlights the path of element ^3. This modification comes with two disadvantages. Operations take more clock cycles to execute in the SHQ, but the complexity in time remains 0(1). The SHQ has higher memory requirements than the PHQ, but maintains a 0{N) complexity in memory. 2.1 Operations in the Structured Heap Queue The SHQ supports 3 operations: insert new element, delete element with given ID and read element with given ID. An update operation, used to change the 011 Figure 1: Schematic representation of the binary memory tree in a structured heap queue. Each element moves down the tree following a unique path from the root node to one of the leaf nodes. The path an element can follow is determined by its identification number (ID). The numbers in a node indicate which elements can possibly occupy this node. Any element can be stored in the root node, but each leaf node is specific to only one element ID. The path associated with an element is found by branching either left or right depending on the binary representation of the element's ID, starting with the left-most bit when branching from the root node. The path associated to element ^3 is shown in bold. value of an existing element in the queue, can be executed by issuing a delete followed by an insert operation. All operations in a structured heap queue start at the root node and progress down the tree, one level at a time. An operation follows the path of the element it is executed on and, on each level of the tree, either promotes (move up) or demotes (move down) one element in order to maintain the heap property. Promoting and demoting elements require three steps: reading the content of one or two nodes, comparing two elements, and writing back the appropriate values to memory. A description of the delete, read and insert operations follows. 2.1.1 Delete and read operations The delete operation is divided into two phases: locate and promote. During the locate phase, only a read step needs to be executed on each level as the operation progresses down the tree. Once the node containing the element to delete is found, the promote phase starts. The two elements in the children nodes of the deleted node are read (read step) and their value is compared (compare step). The element with smallest value is promoted and replaces the deleted element (write step). The same procedure repeats on each remaining level down the tree, selecting one children node to fill the empty node created by the last promotion. An example of a delete operation can be seen in figure [21 Read operations only consist of a locate phase. Figure 2: Delete operation in the structured heap queue. The pair of numbers in a node indicates the identification number (ID) and, inside parentheses, the value of the element. The operation consists in the deletion of the element #3. The operation's steps are indicated on the arrows along with their order in parentheses. Top left Initial state of the queue and first steps of the delete operation. Element #3 is in the root node and thus the locate phase does not take place. The nodes containing elements #2 and #5 are read and their value is compared. Element #5 is promoted to replace element #3. Top right Last steps of the delete operation. The nodes containing elements #4 and #6 are read and their value is compared. Element 7^6 is promoted. Bottom Final state of the queue after the delete operation. 2.1.2 Insert operation When an element is inserted, a certain number of elements have to be demoted to make room for it. On each level, a node is read (read step) and its value is compared with the inserted element's value (compare step). Whichever has the lowest value is written back in the node (write step) and the other one is de- moted. This demoted element defines the path followed by the insert operation is it progresses down the tree. An example of an insert operation is shown in figure [3l 2.2 Design of the structured heap queue As in the PHQ [15[, operations in the SHQ are pipelined. Each level of the tree is a pipeline stage. As soon as an operation is passed to a lower stage of the pipeline, another one can be serviced at the current level. The heap property is always satisfied and the lowest value element occupies the root node at all times, even if operations are still going on in lower levels of the tree. The stages of Figure 3: Insert operation in the structured heap queue. The pair of numbers in a node indicates the identification number (ID) and, inside parentheses, the value of the element. The operation consists in the insertion of the element #7 with value 4. The operation's steps are indicated on the arrows along with their order in parentheses. Top left Initial state of the queue and first steps of the insert operation. The node containing element #3 is read and its value is compared with that of element #7. Element #7 is demoted. Top right Intermediate steps of the insert operation. The node containing element ^5 is read and its value is compared with that of element #7. Element #7 is demoted. Bottom left Last steps of the delete-insert operation. The node containing element 7^6 is read and its value is compared with that of element #7. Element #7 is written back in the node to replace element ^Q this one is demoted. Bottom right Final state of the queue after the insert operation. the pipeline are identical and consist of some hardware resources. As depicted in section 12. 1[ all operations in the SHQ execute the same three steps: read, compare and write-back. Each stage of the pipeline thus has a read and a write port to its corresponding level of the memory tree and a 2-input comparator. Insert operations need to pass the element to insert down the tree, and a register is required for this purpose. Delete operations deal with data on two levels of the tree, 1 node and its 2 children nodes, and so require access to the read port from one level below. Figure S] show a simple block diagram of the SHQ. 2.2.1 Consecutive operations The operations in the structured heap queue can be cascaded, just like in the PHQ. Figure [5] shows how several delete and insert operations can be issued back to back if reads, comparisons and write-backs each take one clock cycle to execute. Refer to figures [2] and [3] for detailed description of the steps involved in the delete and insert operations. Delete operations take longer to execute Read top node A Read Element to insert V P ' L. 3 ■M Write 5 f"'nmn 1 .^ ^, Para mL, OpL, Read / y " U 2 3 ^ Write 5 Pnmn 1 .^ m L^ OpL, Read / " 1' L. 4 5 6 7 , , Write ^ f"'nmn 1 .^ fc. Para mL3 OPL3 Binary memory tree Figure 4: Simple block diagram of the structured heap queue. The same building block is attached to each level "Li" of the binary memory tree. It consists of a read and a write port to level "Lj" of the memory tree, one read port to level "Li_|_i", a comparator ("Comp") and two registers ("Param" and "Op"). These registers hold the current operation type and parameters, for example the element to insert. This information is passed to the next level as the operation progresses down the tree. A separate port exists to read the information of the top node from outside the queue. than insert operations because they deal with data on two levels of the tree. Interleaved delete and insert operations are also shown in figure [SJ Figure [S] shows an example of a delete-insert operation in a 4-level memory-optimized structured heap queue introduced in the next section. 2.3 Memory-optimized structured heap queue Each element in a SHQ is assigned a unique path from the root node to one of the leaf nodes. Thus, there can be as many elements in the queue as there are nodes in the last layer of the tree. An L-level SHQ can store up to 2^^^ elements for 2^ nodes, as shown in figure [T] In the PHQ, the tree is balanced, resulting in a more compact binary tree and lower memory requirement than in the SHQ. In comparison, an L-level PHQ can sort twice as many elements using the same amount of memory. Assuming elements inserted in the queue are given unique IDs, the amount of memory required by the SHQ can be reduced. This is possible because the elements will distribute over the branches of the tree as they are inserted and will never fill the last level of the tree. A 3-level SHQ can store up to 4 elements and comprises 7 nodes. When an element is first inserted in this tree, it settles in the root node on level Lq , as the rest of the tree is empty. A second inserted element will either push the first element down or will itself end up in level Li. Clock cycle 1 2 3 4 5 6 7 8 1=' Delete 2"^* Delete r(L2)x2 c(Li) w(Li) r{L3)x2 c{L2) w(L2) r(L4)x2 r(L2)x2 c(L3) c(Li) 1==* Insert 2"^* Insert r(Li) c(Li) w(Li) r(L2) r(Li) c(L2) c(Li) w(L2) w(Li) r(L3) r(L2) c(L3) c(L2) 1=* Delete 1=* Insert T"^ Delete r(L2)x2 c(Li) r(Li) w(Li) c(Li) r{L3)x2 w{Li) r(L2) w(L2) c(L2) r(L4)x2 w{L2) c(L3) ■■(L3) I'(L2)x2 Figure 5: Cascading delete operations (top), insert operations (center) and in- terleaved delete and insert operations (bottom) in the structured heap queue. Operations consist of a read (r), a compare (c) and a write (w) step. The "Lj" inside parentheses indicates the level of the tree where the read, compare or write takes place. The "x2" subscript indicates that 2 simultaneous reads are performed (this happens in delete operations, as the information of two children nodes is read). A "-" sign means the operation is not started yet. A certain delay must be met before a second operation can start to ensure it will not read data which might be overwritten by a previous operation (e.g. the first delete operation writes information of L2 during clock cycle 6, the second delete cannot be issued before clock cycle 7 because it needs to read of L2). Whatever the case, the root node and one node on level Li will be occupied. Upon insertion of a 3'''^ element, two scenarios are possible. In scenario 1, the insertion causes an element to end up in the still free node of level Li . Before the insertion of the 4*"^ element, the first 2 levels of the tree would be filled and the 3'''* level would be empty. Upon insertion of the last element, one element will be pushed down in a leaf node, on level L2, and the other 3 leaf nodes will remain empty. In scenario 2, the 3'^'^ insertion causes all three elements in the tree to lie on a single branch, with one element on each level of the tree. These 3 elements will be located in the same half of the tree, leaving the other half empty. Because element IDs are unique, the 4*'^ insertion will necessarily result in one element being placed in the still empty node of level Li, again leaving 3 leaf nodes empty. In a 3-level SHQ, only one leaf node can be occupied. Augmenting the 3- level queue to 4 levels is done by adding another 3-level queue next to the first one and a new root node on top of them. The 4-level queue can now sort up to 8 elements. Still, only one element can go all the way down each of the 3-level queues. That is, only two of the 8 available leaf nodes are actually useful. This reasoning holds true whatever the size of the queue. The memory-optimized SHQ reduces the size of the last level of the memory tree by 75%. It can store 2^~^ elements using 1.25 x 2^~^ nodes, which only represents a 25% increase in memory over the PHQ. An example of a 4-level memory-optimized SHQ is shown in figure [T] The last level of a memory-optimized SHQ has to be implemented differently than the other ones, since each of its nodes has 2 parent nodes. Also, 10 Figure 6: Delete- insert operation in a memory-optimized structured heap queue. The pair of numbers in a node indicates the identification number (ID) and, inside parentheses, the value of the element. The operation consists in the deletion of the element #3 directly followed with the insertion of the same element, changing its value. The operation's steps are indicated on the arrows along with their order in parentheses. Top left Initial state of the queue and first steps of the delete- insert operation. The nodes containing elements #1 and #5 are read and their value is compared. Element #5 is promoted to replace element #3. At the same time, the inserted element #3 is compared with newly promoted element #:5 resulting in the demotion of element #3. Top right Intermediate steps of the delete-insert operation. The nodes containing elements #4 and #6 are read and their value is compared. Element #6 is promoted. At the same time, the node containing element #1 is read and its value is compared with that of element #3. Element #3 is demoted. Bottom left Last steps of the delete-insert operation. The delete part of the operation is completed. The node containing element #2 is read and its value is compared with that of element #3. Element #3 is written back in the node to replace element #2 as this one is demoted. Bottom right Final state of the structured queue after the delete-insert operation. each path down the tree in a memory-optimized SHQ is shared by 2 elements. 3 The Structured Heap Queue as an event queue In this section, we demonstrate the use of the SHQ in an event-driven SNN implemented on FPGA. The SNN is based on the Oscillatory Dynamic Link Matcher (ODLM) introduced by Pichevar et al. [27|. The hardware architecture 11 Figure 7: Memory-optimized structured heap queue. The numbers in a node in- dicate which elements can possibly occupy this node. In the memory-optimized SHQ, paths are shared by pairs of 2 elements and leaf nodes are shared by 4 el- ements. In the figure, the path shown in bold is shared by elements #2 and #3. This 4-level memory-optimized SHQ can handle 8 and contains 9 nodes. The last level of the tree uses 75% less memory than in the naive implementation of the SHQ. is inspired by preliminary work from D'Haene [lO|. A very different approach has already been used to port the SNN to hardware [5|, using a large array of 1-bit wide processing units and a time-driven strategy. This massively parallel implementation is efficient when several synchronized neurons spike in the same time step but slows down in periods of low activity. As it is a time-driven implementation, a comparison with the present work is out of the scope of this paper. The ODLM uses the synchronization of spikes in a network of spiking neurons to accomplish binding [20|, |35|. This allows the ODLM to perform different signal processing tasks such as image segmentation, image matching 27] and sound source separation [26] . In the following section, we describe the hardware implementation of the ODLM, present the resource usage and performance of the design and show the results of an image segmentation experiment. 3.1 The Oscillatory Dynamic Link Matcher To facilitate the port to hardware, some of the features of the original ODLM were not implemented on the FPGA. These features, namely global inhibition and a dynamic normalization of synaptic weights, are not essential to the basic operation of the system. The implemented model and the method used to accomplish image segmentation on hardware are described here. 12 3.1.1 The neuron model A Leaky Integrate and Fire (LIF) neuron model 'l2| is used to approximate the behavior of relaxation oscillators. The membrane potential of an isolated neuron with initial potential zero follows -^0 /, -tjr T p.(t)^^ l-e-'/n, (1) where Pi{t) is the membrane potential of neuron i at time t, and /q (input current) and t (membrane time constant) are parameters. When the membrane potential of a neuron reaches the threshold value p^ , it is reset and a spike is emitted. A neuron is reset by subtracting the value p from its membrane potential. A neuron defined by equation ([1]) fires periodically, if p^ is smaller than -^, and acts like a relaxation oscillator. When the membrane potential of neuron i reaches the threshold, the neuron emits a spike. This spike will affect all post-synaptic neurons j to which it is connected. The neurons j will have their membrane potential instantly increased by an amount Wij. This is shown in equation ([2]), where ts^ is the time at which neuron i spikes and Wij is the synaptic weight between pre-synaptic neuron i and post-synaptic neuron j. Pj (tsi) -^ Pj [ts, ) + Wij (2) Synapses are defined by a positive scalar weight computed using equation ([3|). where Wij is the synaptic weight connecting neuron i to neuron j, yj'^'^^^ is the maximum value for a weight, fi is a feature of the input associated to neuron i, and a and 5 are parameters which must be adapted to the processing task. 1 Wji = w MAX M 1 - T^-^raTTTTF^ ) (^) 3.1.2 Image segmentation using the ODLM The topology of the network and the features used depend on the signal process- ing task to accomplish. For image segmentation, a flat, 2-dimensional nearest neighbor network, where each neuron is bidirectionally connected to its 8 neigh- bors, is used. In this work, each pixel of the image is associated to a neuron in the network and the gray level of the image's pixels (an integer number in the range to 255) is used as the feature to compute synaptic weights. The seg- mentation of a TV-pixel image thus requires a network of N neurons and 8 x TV synaptic connections. Once the weight values are calculated, the membrane potential of the neurons is initialized randomly and the network is run until convergence is reached. As they interact, neurons connected by strong synaptic weights will tend to synchronize, firing at the same instant. When the groups of synchronized neurons remain unchanged for a number of neuron oscillations, the network is said to have reached convergence. The final membrane potential value of the neurons is analyzed to determine the image's segmentation: neurons with similar final membrane potential values are part of the same segment. 13 3.2 Event-driven ODLM According to equation ([T]), the potential of an isolated neuron increases contin- uously. Inverting this equation yields equation ^, where iPo~*P is the time it takes for a neuron with initial potential to reach potential p. tPo^P(^p) = ^r\n(l~PY^ (4) Using equation Q, it is possible to calculate a neuron's next firing time The state of the neurons is stored in memory as the predicted time of their next spike. Processing an event involves modifying neuron potentials, and not directly their predicted firing times. A neuron's predicted firing time must be translated into a membrane potential before equation ([3]) is applied. A new membrane potential is obtained which is translated back into a new predicted firing time and written in memory. Equations ([T]) and Q define the mapping between firing time and membrane potential. Each time the SNN processes an event, the current time t is updated to this event's time of occurrence tg-. When a spike is processed, the pre-synaptic neuron is reset and a synaptic weight is added to the membrane potential of each of the post-synaptic neurons. These two operations are very similar, as they both consist in the modification of the membrane potential of a neuron. Algorithm [3] is used to apply the effect of an incoming spike on a post-synaptic neuron, that is, to add a synaptic weight to its membrane potential. Algorithm 3 Processing of a spike Identify the post-synaptic neuron to process Retrieve the neuron's firing time and pixel value Calculate the neuron's current membrane potential Calculate the synaptic weight Calculate the neuron's new membrane potential Calculate the neuron's new next firing time Update the neuron's information in memory The same algorithm can be used to reset the pre-synaptic neuron, with a single difference: instead of adding a synaptic weight to the membrane potential of the neuron, step [5] of algorithm [3] resets the membrane potential (and dis- cards the synaptic weight calculated in stepH]). For the processing of an event, algorithm [3] is executed N + 1 times, where N is the number of post-synaptic neurons. During the extra execution, the pre-synaptic neuron is reset. 14 3.3 Hardware implementation The SNN is an implementation of algorithms [2] and [3] on a FPGA. It consists of a controller, a processing element (PE), an event queue and a merger. The PE implements algorithm [3] and can be duplicated to reduce processing time. Figure [5] gives an overview of the resulting system and its various components are detailed in the following sections. NewPreFiringTime NewPreNeuronNbr NewPrePixelValue Merger TopNeuronNbr TopFiringTime TopPixelValue Event queue PostNeuronNbr PostNewFiringTime Processing element SimulationTime PreNeuronNbr PrePixelValue SynapseNbr Controller Figure 8: A high level viev^r of the HSNN. The controller receives the next event's information from the merger and forwards it to the processing element (PE) along with some control signals. The PE identifies the post- synaptic neurons, and computes the required synaptic weights and the new state of the processed neurons. The new state of the post-synaptic neurons is sent to the event queue for update and the queue is sorted on-the-fly. The merger reads the event on top of the event queue and sends it to the controller. If several PEs and event queues are used, the merger chooses the very next event to happen and the controller distributes the processing load among the PEs. 3.3.1 Controller The controller realizes step |4] of algorithm [2] It receives from the merger the next event to be processed, then updates the simulation time and forwards the event for processing. If several PEs are implemented, the post-synaptic neurons to be processed can be evenly distributed among them. In the present work, all neurons are serially processed by a single PE, but several PEs could very well be used. The controller also takes care of the communications with the computer host. 15 3.3.2 Processing element A PE instantiates step |3] of algorithm [5] as detailed in algorithm [31 An overview of a PE is given in figure^ PEs receive a synapse number, a pre-synaptic neuron ID, a weight parameter and the simulation time from the controller. A 5-stage pipeline processes the neurons involved in the event, computing their new state. In the first stage of the pipeline, step [T] of algorithm [3] is executed. Stage 2 executes the [51^'^ step of the algorithm. Steps [3] and H] are executed in the 3'^'^ stage of the pipeline. The 4**^ stage implements steps [5] and |6] and the last stage executes step [7] . Each stage of the pipeline takes one clock cycle to execute. Most of the computations are performed by memory look-up. To implement an equation by a look-up tablqj, one has to pre-compute the output of the equation for several (or all) input values and save the result in memory. To evaluate the equation, the input value for which the equation has to be computed is used as the address of the memory to retrieve the output value of the equation. In the processing pipeline, this technique is used for the weight calculation, the neuron model and the inverse neuron model. A description of all the stages of the pipeline follows. Topology solver The topology solver identifies the neurons involved in the current event and outputs their ID. The block outputs the neuron IDs one at a time and indicates with a flag if the current ID corresponds to the pre-synaptic neuron or to one of the post-synaptic neurons (see section 13. 2p . A functional view of the topology solver is shown in figure 1101 Neuron state memory In the second stage of the pipeline, the post-synaptic neuron's information is retrieved from the neuron state memory. This memory stores the state variables and parameters of the neurons. For the image segmen- tation experiment, a firing time and a pixel value are stored for each neuron. Neuron IDs are used to address the neuron state memory. Weight calculator The weight calculator takes two pixel values and com- putes the corresponding synaptic weight. The calculation of the weight depends on the difference between the pre-synaptic neuron's pixel value and the post- synaptic neuron's pixel value. A functional view of the weight calculator is shown in figure 1111 Membrane model The membrane model calculates the membrane potential at the current simulation time given a firing time. A functional view of the membrane model is shown in figure 1121 ^In the paper, the term look-up table can refer to two different things. For clarity, "look-up table" will designate the implementation of an equation by memory look-up while the acronym LUT will be used for the FPGA resource (see section 14.11 1 16 Stage 2 Stage 3 Stage 4 Stage 5 -PostNeuronNbF- -PoslPixelValue— ► SynWeighl — > n — " — PostNewFirmgTim e — > Figure 9: A processing element of the hardware event-driven system. The inputs to the pipeline are coming from the controller and the outputs are sent to the event queue. The topology solver identifies the post-synaptic neurons associated with the event. The neuron state memory stores the state of all neurons. It has one read and one write interface, the latter being used for write- back in the last stage of the pipeline. The weight calculator computes a synaptic weight based on the pixel value of the processed neurons. The membrane model translates the firing time of a neuron into a membrane potential value. The synapse model either adds a synaptic weight to the membrane potential of a neuron or resets this neuron. The inverse membrane model translates the new membrane model back into a firing time. Signals crossing dashed lines are delayed appropriately (delay elements not shown). -SamePreAndPos*- — PostNeuronNbF — ► r> = 0? — SynapseNbF^ Topology LUT ^~. ■J Figure 10: The topology solver is the 1*^' stage of the pipeline in a processing element. The synapse number is used as the address to the topology look-up table which outputs an offset to add to the pre-synaptic neuron ID. If the offset is 0, a flag is set, indicating that the pre-synaptic and post-synaptic neuron IDs are equal. Synapse model The synapse model has a different role depending on the value of the flag outputted by the topology solver. If the flag is 0, then the post-synaptic neuron's potential is added to the synaptic weight. Otherwise, the processed neuron is the pre-synaptic neuron, and its potential is reset. A functional view of the synapse model is shown in flgure 1131 17 -PrePixelValue ►(+ ^i WeightParamDifl^ Weight LUT ^SynWeight* -PostPixel Value ' Figure 11: The weight calculator composes, with the membrane model, the 3'''^ stage of the pipeline of a processing element. The pixel difference is used as the address to a look-up table which outputs the synaptic weight. — PostFiringTimi -SimulationTim& -PostPhase — ► Membrane model LUT -PostPotential- Figure 12: The membrane model, along with the weight calculator, is part of the 3"^ pipeline stage in a processing element. The subtraction of the simulation time to the firing time of a neuron results in a value which represents how far from the threshold the neuron is. This value is used as the address of a look-up table to get the membrane potential of the neuron. Inverse membrane model The inverse membrane model computes the new firing time of a neuron based on its new membrane potential. A functional view of the inverse membrane model is shown in figure 1141 State memory write back Once the new firing time is calculated, it is written back into the neuron state memory. This is done in the last stage of the processing pipeline. 3.3.3 Event queue The event queue is implemented by the structured heap queue described in section [2j The interface between the PE and the event queue is very simple. At initialization, insert operations are issued to populate the event queue with the neurons' initial predicted firing time. During the processing, when the PE computes the new firing time of a neuron, the information in the event queue must be updated. This is done by issuing a delete-insert operation with the neuron ID and the new firing time. For every neuron involved in an event, a delete-insert operation must be serviced by the event queue. The root node is then read to start the processing of the next event. 3.3.4 Merger The merger is required when several PEs are used in parallel. It scans the top nodes of all the event queues to determine the very next event to be processed. 18 -SamePreAndPos -SynWeight ►^ o threshold -PostNewPotentiaf Figure 13: The synapse model is combined with the inverse membrane model to form the 4"^ stage of the pipehne in a processing element. The post-synaptic neurons' membrane potential is added to the synaptic weight if the input flag is 0. Otherwise, the value p^ is subtracted from the potential to reset the pre- synaptic neuron. — PostNewPotential-> Inverse membrane model LUT PostNewPhase — ►(+ i ) — PostNewFiringTim8> """"■""" ^ Figure 14: The inverse membrane model and the synapse model form the 4**^ stage of the pipeline. The post-synaptic neuron's membrane potential is the address to a look-up table which outputs the amount of time left until the neuron fires. This value is added to the simulation time to get the new neuron's firing time. In the present work, the merger simply passes the information of the element in the root node of the single event queue to the controller. 4 Results A network of 65 536 neurons is implemented on a Xilinx XC5VSX50T FPGA clocked at 100 MHz. For the image segmentation experiment, each neuron has 8 synapses for a total of 524 288 implemented synapses. The next sections sum- marize the resource usage of the design and the result of the image segmentation experiment. 4.1 Resource usage The membrane potential and firing time values are 13-bit wide so the membrane model and inverse membrane model look-up tables can each be implemented an assembly of 3 BRAMs. The pixel values and synaptic weights are respectively 8-bit and 9-bit wide. The resources usage in terms of flip-fiops (FFs), look- up tables (LUTs) and block RAMs (BRAMs) for the whole system is given 19 Table 1: Resource usage for the whole system RESOURCE USED AVAILABLE % USED FFs 3 368 32 640 10% LUTs 4 673 32 640 14% Slices 2 855 8 160 35% BRAMs 130 132 98% Table 2: Resource usage for each functional block FUNCTION FFs LUTs BRAMs Controller 503 635 Processing element 19 73 50 Topology solver 16 26 Neuron memory 1 1 44 Weight calculator 8 Membrane model 1 14 3 Synapse model 10 Inverse membrane model 1 14 3 Event queue 2 846 3 965 80 Merger N/A N/A N/A in table [l] and table [2] details these numbers for each functional block of the design. Please note that in a Xilinx FPGA, a LUT is a resource mainly used to implement logical operations. In the other sections of this paper, the term look-up table designates the implementation of an equation by memory look-up. 4.2 Image segmentation The results of an image segmentation task using the event-driven SNN are pre- sented in this section. For this experiment, a host computer transfers the pixel values of the image and random initial potential of the neurons into the SNN. The host computer also populates the various look-up tables in the PE as well as the event queue. The SNN is then run for a given time and the final membrane potential values are sent back to the computer for visualization. The parameters of equations ([T]) and ([3]), using the pixels' level of gray as features, are set to: /o = 6.918, T = 0.1447, v^ = 1, w^ax = 0.0325, a = 100, 5 = 6. The network was run for 200 ms. The original and segmented images are presented in figure [T5l The same task on a general purpose computer (Intel Core 15 @2.4GIIz, 3GB RAM) executes in 1.9 seconds. 20 Figure 15: Image segmentation experiment. Top The original 406x158 pixel image. Bottom The segmented image, where different colors represent different segments. The segmentation is solely based on pixel values and the HSNN merges the lower part of the image with the tires of the car. Also, the foliage in the background is segmented with preservation of the texture. 5 Discussion An event-driven SNN using the SHQ presents three major advantages: scala- bility, versatility and powerful resource sharing. These aspects are covered in the next sections. The main dra wback of th e SHQ is the memory overhead of 25% compared to a PHQ and to lAgis et al.l 's search algorithm. This overhead only is a constant scaling factor and the SHQ has the same 0{N) complexity in memory as the two other algorithms. 5.1 Scalability The scalability of a SNN defines the impact of increasing the number of neurons on performance and hardware resources used. In an event-driven SNN, this is greatly affected by the complexity of the event queue. Table [3] compares the complexity in time, logic resources and memory of the SHQ and the pipelined search of Agis et al. jlj . Operations on "top element" refer to the next event to happen. The most important values are the complexity in logic, and the co mplexity in time of the delete top element and the read operations. lAgis et al.l 's pipelined search uses a 4-level comparator tree. With this structure, it is possible to trade logic resources for time, by dividing the set of elements into subsets and processing each one serially. For example, N can be doubled without increasing 21 Table 3: Comparison of the complexity in logic, memory and time of the struc tured heap queue (SHQ) and lAgis et alJ 's search algorithm, with N the number of elements in the queue SHQ Agis et al. [1] Complexity in logic 0(log(iV)) 0{N)* Complexity in memory 0{N) 0{N) Complexity in time for Delete top element 0(1) 0(log(7V))* Delete any element 0(1) 0(1) Insert 0(1) 0(1) Read top element 0(1) 0(log(7V))* Read any element 0(log(iV)) 0(1) *In m, logic can be traded for time, and conversely, time for logic. the amount of logic resources, but the search would take twice the amount of time to execute. If the processing time is kept constant, the number of comparators increases linearly with TV. The SHQ, on the other hand, uses a binary memory tree and requires one 2-input comparator per level of the tree. This results in a much nicer logarithmic scaling of logic resources with the number of elements. To delete or read the top element when using the pipelined search, the smallest value element must first be identified. This requires logarithmic time, with a radix depending on the exact structure of the comparator tree. With the SHQ, deleting the top element is done by reading the root node and issuing a delete operation with the correct ID. This operation requires a certain amount of time to complete, but it is not necessary to wait for it to be done before the queue is usable again. When the delete operation executes on the top level of the tree, it selects one of the children node and promotes it. The promoted node, readable in the root node as soon as the delete operation is passed down to the second level of the queue, is the new smallest value element of the queue. All operations, except for the read any element, effectively execute in constant time with respect to the number of elements. The read top element operation executes in 1 clock cycle, as a special read port is provided for this purpose (see figure m . The pipelined search has a better complexity than the SHQ for the read any element operation. Because they use an unsorted list, elements can be read very simply. This is not the case with the SHQ, in which a read operation might have to scan all the levels of the binary memory tree before it finds the element it is looking for. This logarithmic complexity does not compare very well with the constant time of the pipelined search. Nevertheless, this is not of much importance for the implementation of an event queue. As explained in section [11 the read any node operation is not required in a SNN. 22 To show the benefits of the digital hardware SNN over an implementation on CPU, experiments were done with a software version of the SNN described in this paper. A software SNN of increasing size was run and the time required to process 250 000 spikes is reported in figure [1^1 The figure shows the loga- rithmic scaling of processing time with the number of neurons of the software implementation. To compare these results, the theoretical constant time scal- ing of the FPGA implementation is also shown with the real performance of the 65 536 neurons SNN as a baseline. Real experiments could not be run on FPGA because of the network size involved. With smaller networks, the logarithmic scaling of the software implementation is much less obvious. 2000 3000 4000 5000 6000 7000 8000 Number of neurons (xlOOO) Figure 16: Comparison of the processing speed for a software and a FPGA implementation of the SNN. For CPU, results show the amount of time required to process 250 000 spikes with networks of various sizes. The values reported for FPGA are based on the theoretical complexity given in section [01 5.2 Resource sharing and performance The SNN implementation shown in this paper illustrates the power of resource sharing. A single PE is used, but a 65 536-neuron, 513 184-synapse SNN is implemented. This is typical of digital hardware circuits: resource sharing, or time multiplexing, allows great flexibility with regard to the amount of resources used. The implementation can be tailored to the specific needs of the designer and to the resources at his disposal. If resource shortage limits the design to only one PE, a SNN of arbitrary size can still be designed. If performance is an issue, spare resources can be used to duplicate the PE and cut the processing time. In the presented SNN, a PE can process one post-synaptic neuron every 7 clock cycles. It would be possible to modify the system we presented and use 9 PEs (the number of neurons involved in an event) with minimal added 23 design effort. Each PE would process one of the involved neurons, resulting in a processing speed of one event per 7 clock cycles. 5.3 Versatility As a last point, the SHQ can be used in virtually any digital hardware event- driven SNN. In this paper, we chose to use LIE neurons, a regular network topology, look-up tables computations, and so on. The SHQ is oblivious to all of this. Irregular network topologies or dynamic synaptic weights could be used. It does not matter if event times are exact or approximated. The SHQ only brings constraints on timing: insert operations can only be serviced every 3 clock cycles and delete-insert operations every 7 clock cycles. 6 Conclusion In this paper, the structured heap queue (SHQ), was introduced as a good candidate to implement the event queue of an event-driven digital hardware spiking neural network. The use of the SHQ was demonstrated in the EPGA implementation of a SNN and tested with an image segmentation task. With the SHQ, it is possible to process one event every 7 clock cycles, no matter the size of the SNN. The SHQ is very similar to the pipelined heap queue 151,141, but it is especially well suited for the application. In the SHQ any existing element can be deleted in constant time, a crucial feature for the implementation of an event queue. An alternate solution to the SHQ is the pipelined search algorithm used in [1|. The SHQ has a better complexity both in logic resources and in time for the operations required in an event queue. With the SHQ, doubling the number of events to manage results in double the amount of memory and one more 2-input comparator. Processing time is not affected. The SHQ can be put to use in virtually any event-driven digital hardware SNN. Acknowledgements This work has been funded by the Natural Sciences and Engineering Research Council of Canada (NSERC) and the Fonds quebecois de la recherche sur la na- ture et les technologies (EQRNT). The collaborative work between Universit de Sherbrooke and Ghent University was made possible by a grant from NSERC 's Michael Smith Foreign Study Supplements Program. It allowed for Sherbrooke's signal processing SNN ODLM [27| to be implemented using Ghent's event-driven hardware algorithms [10|. 24 References [1] Agis, R., Ros, E., Diaz, J., Carrillo, R., & Ortigosa, E. M. (2007). Hardware event-driven simulation engine for spiking neural networks. International Journal of Electronics, §4, 469-480. [2] Bako, L. (2009). Real-time clustering of datasets with hardware embed- ded neuromorphic neural networks. In High Performance Computational Systems Biology, 2009. HIBI '09. International Workshop on (pp. 13-22). [3] Basu, A., Ramakrishnan, S., & Hasler, P. (2010). Neural dynamics in reconfigurable silicon. In 2010 IEEE International Symposium on Circuits and Systems (pp. 1943-1946). [4] Bhagwan, R., & Lin, B. (2000). Fast and scalable priority queue archi- tecture for high-speed network switches. In INFOCOM 2000. Nineteenth Annual Joint Conference of the IEEE Computer and Communications So- cieties (pp. 538-547). [5] Caron, L.-C, Mailhot, F., & Rouat, J. (2011). FPGA implementation of a spiking neural network for pattern matching. In 2011 IEEE International Symposium on Circuits and Systems (pp. 649-652). [6] Cassidy, A., Andreou, A., & Georgiou, J. (2011). Design of a one million neuron single fpga neuromorphic system for real-time multimodal scene analysis. In Information Sciences and Systems (CISS), 2011 45th Annual Conference on (pp. 1-6). [7] Cawley, S., Morgan, F., McGinley, B., Pande, S., McDaid, L., Carrillo, S., & Harkin, J. (2011). Hardware spiking neural network prototyping and application. Cenetic Programming and Evolvable Machines, 12, 257-280. [8] Cheung, K., Schultz, S., & Luk, W. (2012). A large-scale spiking neu- ral network accelerator for fpga systems. In Lecture Notes in Computer Science, 7552, 113-120. [9] Delorme, A., & Thorpe, S. (2003). SpikeNET: an event-driven simulation package for modelling large networks of spiking neurons. Network: Com- putation in Neural Systems, 14, 613-627. [10] D'Haene, M. (2010). Efficiente simulatietechnieken voor gepulste neurale netwerken. Ph.D. thesis. [11] D'Haene, M., Schrauwen, B., Van Campenhout, J., & Stroobandt, D. (2009). Accelerating event-driven simulation of spiking neurons with mul- tiple synaptic time constants. Neural computation, 21, 1068-99. [12] Gerstner, W., & Kistler, W. (2002). Spiking Neuron Models. Cambridge University Press. 25 [13] Gonnet, G. H., & Rogers, L. D. (1975). An algorithmic and complexity analysis of the heap as a data structure. Technical Report Department of Computer Science, University of Waterloo, Waterloo. [14] Grassmann, C., & Anlauf, J. (1999). Fast digital simulation of spiking neural networks and neuromorphic integration with spikelab. International Journal of Neural Systems, 9, 473-8. [15] loannou. A., & Katevenis, M. G. H. (2007). Pipehned Heap (Priority Queue) Management for Advanced Scheduling in High-Speed Networks. IEEE/ACM Transactions on Networking, 15, 450-461. [16] Lee, G., & Farhat, N. (2001). The double queue method: a numerical method for intcgratc-and-firc neuron networks. Neural Networks, 14, 921- 32. [17] Maass, W. (1997). Networks of spiking neurons: the third generation of neural network models. Neural Networks, 10, 1659-1671. [18] Mattia, M., & Del Giudice, P. (2000). Efficient event-driven simulation of large networks of spiking neurons and dynamical synapses. Neural Com- putation, 12, 2305-29. [19] Mehrtash, N., Jung, D., Hellmich, H. H., Schoenauer, T., Lu, V. T., & Klar, H. (2003). Synaptic plasticity in spiking neural networks (SP2INN): a system approach. IEEE transactions on neural networks, 14, 980-992. [20] Milner, P. (1974). A model for visual shape recognition. Psychological Review, 81, 521-535. [21] Moradi, S., & Indivcri, G. (2011). A vlsi network of spiking neurons with an asynchronous static random access memory. In 2011 IEEE Biomedical Circuits and Systems Conference, BioCAS 2011 (pp. 277-280). [22] Morrison, A., Mehring, C., Geisel, T., Aertsen, A., & Diesmann, M. (2005). Advancing the boundaries of high-connectivity network simulation with distributed computing. Neural Computation, 17, 1776 801. [23] Morrison, A., Straube, S., Plesser, H., & Diesmann, M. (2007). Exact subthreshold integration with continuous spike times in discrete-time neural network simulations. Neural Computation, 19, Al-TH. [24] Mouraud, A., & Puzcnat, D. (2009). Simulation of Large Spiking Neu- ral Networks on Distributed Architectures, The DAMNED Simulator. In Communications in Computer and Information Science, 43, 359-370. [25] Nageswaran, J. M., Dutt, N., Krichmar, J. L., Nicolau, A., & Veidenbaum, A. V. (2009). A configurable simulation environment for the efficient simu- lation of large-scale spiking neural networks on graphics processors. Neural networks, 22, 791-800. 26 [26] Pichevar, R., & Rouat, J. (2007). Monophonic sound source separation with an unsupervised network of spiking neurones. Neurocomputing , 71, 109-120. [27] Pichevar, R., Rouat, J., & Tai, L. (2006). The oscihatory dynamic link matcher for spiking- neuron-based pattern recognition. Neurocomputing , 69, 1837-1849. [28] Plana, L., Furber, S., Temple, S., Khan, M., Shi, Y., Wu, J., & Yang, S. (2007). A gals infrastructure for a massively parallel multiprocessor. Design Test of Computers, IEEE, 24, 454 -463. [29] Pratt, G. (1990). Pulse Computation. Ph.d. thesis Massachusetts Institute of Technology. Dept. of Electrical Engineering and Computer Science. [30] Ros, E., Ortigosa, E., Agis, R., Carrillo, R., & Arnold, M. (2006). Real-time computing platform for spiking neurons (RT-spike). IEEE transactions on Neural Networks, 17, 1050-1063. [31] Schoenauer, T., Atasoy, S., Mehrtash, N., & Klar, H. (2002). NeuroPipe- Chip: A digital neuro-processor for spiking neural networks. IEEE Trans- actions on Neural Networks, 13, 205-213. [32] Schrauwen, B., D'Haene, M., Verstraeten, D., & Campenhout, J. V. (2008). Compact hardware liquid state machines on FPGA for real-time speech recognition. Neural networks, 21, 511-23. [33] Seo, J., Brezzo, B., Liu, Y., Parker, B., Esser, S., Montoye, R., Rajendran, B., Tierno, J., Chang, L., Modha, D., & Friedman, D. (2011). A 45nm CMOS neuromorphic chip with a scalable architecture for learning in net- works of spiking neurons. In Custom Integrated Circuits Conference (pp. 1-4). [34] Thomas, D., & Luk, W. (2009). FPGA accelerated simulation of biologi- cally plausible spiking neural networks. In 2009 17th IEEE Symposium on Field Programmable Custom Computing Machines (pp. 45-52). [35] Von Der Malsburg, C. (1981). The correlation theory of brain function. In Models of Neural Networks II: Temporal Aspects of Coding and Information Processing in Biological Systems July 1981 (pp. 95-119). [36] Watts, L. (1994). Event-driven simulation of networks of spiking neurons. Advances in neural information processing systems (pp. 927-927). 27